home *** CD-ROM | disk | FTP | other *** search
/ Dr. Windows 3 / dr win3.zip / dr win3 / WINPROGS / UPC12BS1.ZIP / UUCICO / ULIBOS2.C < prev    next >
C/C++ Source or Header  |  1993-10-03  |  41KB  |  1,298 lines

  1. /*--------------------------------------------------------------------*/
  2. /*    u l i b o s 2 . c                                               */
  3. /*                                                                    */
  4. /*    OS/2 serial port support for UUCICO                             */
  5. /*--------------------------------------------------------------------*/
  6.  
  7. /*--------------------------------------------------------------------*/
  8. /*    Changes Copyright (c) 1989-1993 by Kendra Electronic            */
  9. /*    Wonderworks.                                                    */
  10. /*                                                                    */
  11. /*    All rights reserved except those explicitly granted by the      */
  12. /*    UUPC/extended license agreement.                                */
  13. /*--------------------------------------------------------------------*/
  14.  
  15. /*--------------------------------------------------------------------*/
  16. /*                          RCS Information                           */
  17. /*--------------------------------------------------------------------*/
  18.  
  19. /*
  20.  *       $Id: ulibos2.c 1.23 1993/10/03 22:09:09 ahd Exp $
  21.  *       $Log: ulibos2.c $
  22.  * Revision 1.23  1993/10/03  22:09:09  ahd
  23.  * Use unsigned long to display speed
  24.  *
  25.  * Revision 1.22  1993/10/01  01:17:44  ahd
  26.  * Drop unneeded special case for port in use message
  27.  *
  28.  * Revision 1.21  1993/09/29  05:25:21  ahd
  29.  * Don't die after duplicate port close
  30.  *
  31.  * Revision 1.20  1993/09/29  04:52:03  ahd
  32.  * Use unique handler for port suspending
  33.  *
  34.  * Revision 1.19  1993/09/27  04:04:06  ahd
  35.  * Normalize references to modem speed to avoid incorrect displays
  36.  *
  37.  * Revision 1.18  1993/09/25  03:07:56  ahd
  38.  * Convert to standard OS/2 error message call
  39.  *
  40.  * Revision 1.17  1993/09/24  03:43:27  ahd
  41.  * Use OS/2 error message routine
  42.  *
  43.  * Revision 1.16  1993/09/21  01:42:13  ahd
  44.  * Use standard MAXPACK limit for save buffer size
  45.  *
  46.  * Revision 1.15  1993/09/20  04:46:34  ahd
  47.  * OS/2 2.x support (BC++ 1.0 support)
  48.  * TCP/IP support from Dave Watt
  49.  * 't' protocol support
  50.  *
  51.  * Revision 1.14  1993/05/30  15:25:50  ahd
  52.  * Multiple driver support
  53.  *
  54.  * Revision 1.13  1993/05/30  00:08:03  ahd
  55.  * Multiple communications driver support
  56.  * Delete trace functions
  57.  *
  58.  * Revision 1.12  1993/05/09  03:41:47  ahd
  59.  * Make swrite accept constant input strings
  60.  *
  61.  * Revision 1.11  1993/04/11  00:34:11  ahd
  62.  * Global edits for year, TEXT, etc.
  63.  *
  64.  * Revision 1.10  1993/04/10  21:25:16  dmwatt
  65.  * Add Windows/NT support
  66.  *
  67.  * Revision 1.9  1993/04/05  04:32:19  ahd
  68.  * Additional traps for modem dropping out
  69.  *
  70.  * Revision 1.8  1993/04/04  04:57:01  ahd
  71.  * Add configurable OS/2 priority values
  72.  *
  73.  * Revision 1.7  1992/12/30  13:02:55  dmwatt
  74.  * Dual path for Windows/NT and OS/2
  75.  *
  76.  * Revision 1.6  1992/12/11  12:45:11  ahd
  77.  * Correct RTS handshake
  78.  *
  79.  * Revision 1.5  1992/12/04  01:00:27  ahd
  80.  * Add copyright message, reblock other comments
  81.  *
  82.  * Revision 1.4  1992/11/29  22:09:10  ahd
  83.  * Add new define for BC++ OS/2 build
  84.  *
  85.  * Revision 1.3  1992/11/19  03:00:39  ahd
  86.  * drop rcsid
  87.  *
  88.  * Revision 1.2  1992/11/15  20:11:48  ahd
  89.  * Add English display of modem status and error bits
  90.  *
  91.  */
  92.  
  93. /*--------------------------------------------------------------------*/
  94. /*                        System include files                        */
  95. /*--------------------------------------------------------------------*/
  96.  
  97. #include <stdlib.h>
  98. #include <stdio.h>
  99. #include <string.h>
  100. #include <fcntl.h>
  101. #include <io.h>
  102. #include <time.h>
  103.  
  104. /*--------------------------------------------------------------------*/
  105. /*                         OS/2 include files                         */
  106. /*--------------------------------------------------------------------*/
  107.  
  108. #define INCL_DOSDEVIOCTL
  109. #define INCL_BASE
  110. #define INCL_NOPMAPI
  111.  
  112. #include <os2.h>
  113. #include <limits.h>
  114.  
  115. #ifndef __OS2__
  116. typedef USHORT APIRET ;  // Define older API return type
  117. #endif
  118.  
  119. /*--------------------------------------------------------------------*/
  120. /*                    UUPC/extended include files                     */
  121. /*--------------------------------------------------------------------*/
  122.  
  123. #include "lib.h"
  124. #include "ulib.h"
  125. #include "ssleep.h"
  126. #include "catcher.h"
  127. #include "pos2err.h"
  128.  
  129. #include "commlib.h"
  130. #include "usrcatch.h"
  131.  
  132. /*--------------------------------------------------------------------*/
  133. /*                          Global variables                          */
  134. /*--------------------------------------------------------------------*/
  135.  
  136. currentfile();
  137.  
  138. static boolean   carrierDetect = FALSE;  /* Modem is not connected     */
  139.  
  140. static boolean hangupNeeded = FALSE;
  141.  
  142. static unsigned short currentSpeed = 0;
  143.  
  144. #define FAR_NULL ((PVOID) 0L)
  145.  
  146. /*--------------------------------------------------------------------*/
  147. /*           Definitions of control structures for DOS API            */
  148. /*--------------------------------------------------------------------*/
  149.  
  150. static HFILE com_handle;
  151. static struct _LINECONTROL com_attrib;
  152. static struct _MODEMSTATUS com_signals;
  153. static struct _DCBINFO com_dcbinfo;
  154.  
  155. static void ShowError( const USHORT status );
  156.  
  157. static void ShowModem( const BYTE status );
  158.  
  159. /*--------------------------------------------------------------------*/
  160. /*    n o p e n l i n e                                               */
  161. /*                                                                    */
  162. /*    Open the serial port for I/O                                    */
  163. /*--------------------------------------------------------------------*/
  164.  
  165. int nopenline(char *name, BPS baud, const boolean direct )
  166. {
  167.  
  168.    APIRET rc;
  169.    USHORT com_error;
  170.  
  171. #ifdef __OS2__
  172.    ULONG ParmLengthInOut;
  173.    ULONG DataLengthInOut;
  174.  
  175.    ULONG action;
  176.  
  177. #else
  178.    USHORT action;
  179. #endif
  180.  
  181.    if (portActive)               /* Was the port already active?    */
  182.       closeline();               /* Yes --> Shutdown it before open */
  183.  
  184. #ifdef UDEBUG
  185.    printmsg(15, "nopenline: %s, %lu", name, baud);
  186. #endif
  187.  
  188. /*--------------------------------------------------------------------*/
  189. /*                      Validate the port format                      */
  190. /*--------------------------------------------------------------------*/
  191.  
  192.    if (!equaln(name, "COM", 3 ))
  193.    {
  194.       printmsg(0,"nopenline: Communications port begin with COM, was %s",
  195.          name);
  196.       panic();
  197.    }
  198.  
  199. /*--------------------------------------------------------------------*/
  200. /*                          Perform the open                          */
  201. /*--------------------------------------------------------------------*/
  202.  
  203.    rc = DosOpen( name,
  204.                  &com_handle,
  205.                  &action,
  206.                  0L,
  207.                  0 ,
  208.                  FILE_OPEN ,
  209.                  OPEN_FLAGS_FAIL_ON_ERROR |
  210.                  OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYREADWRITE, 0L );
  211.  
  212. /*--------------------------------------------------------------------*/
  213. /*    Check the open worked.  We translation the common obvious       */
  214. /*    error of file in use to english, for all other errors are we    */
  215. /*    report the raw error code.                                      */
  216. /*--------------------------------------------------------------------*/
  217.  
  218.    if ( rc )
  219.    {
  220.       printOS2error( name, rc );
  221.       return TRUE;
  222.    }
  223.  
  224. /*--------------------------------------------------------------------*/
  225. /*            Reset any errors on the communications port             */
  226. /*--------------------------------------------------------------------*/
  227.  
  228. #ifdef __OS2__
  229.  
  230.    ParmLengthInOut = 0;
  231.    DataLengthInOut = sizeof(com_error);
  232.    rc = DosDevIOCtl( com_handle, IOCTL_ASYNC, ASYNC_GETCOMMERROR,
  233.       NULL,0L,&ParmLengthInOut,(PVOID) &com_error,sizeof(com_error),
  234.       &DataLengthInOut);
  235.  
  236. #else
  237.  
  238.    rc = DosDevIOCtl( &com_error, FAR_NULL, ASYNC_GETCOMMERROR ,
  239.                      IOCTL_ASYNC, com_handle);
  240.  
  241. #endif
  242.  
  243.    if (rc)
  244.    {
  245.       printmsg(0,
  246.             "nopenline: Unable to read errors for %s, erro